Spring Boot 初始化及加载
1. 设置开关
bannerMode (横幅模式,默认为CONSOLE)
logStartupInfo (日志开关,默认为true)
addCommandLineProperties (添加命令行属性开关,默认为true)
headless (程序运行模式,java.jwt.headless=true)
registerShutdownHook (注册销毁回调,默认为true)
2.初始化profile容器
存储当前激活的profile
3.初始化
3.1 推断运行环境
首先判定classpath下是否包含javax.servlet.Servlet
类或org.springframework.web.context.ConfigurableWebApplicationContext
类,若包含二者其中一个,则推断当前程序为web程序
3.2 初始化初始工厂类
加载在classpath:META-INF/spring.factories
文件中属性key
为org.springframework.context.ApplicationContextInitializer
的值——工厂类的全限定名
3.3 初始化容器监听
加载在classpath:META-INF/spring.factories
文件中属性key
为org.springframework.context.ApplicationListener
的值——容器监听的全限定名
3.4 推断程序入口主类
根据栈帧推断程序入口类
4.加载
4.1 注册StopWatch
并打开
4.2 初始化环境配置容器
4.3 初始化失败分析器
4.4 响应程序运行模式(前面提到的 java.awt.headless,这里不扩展此点,自行查阅资料)
4.5 加载spring boot监听
加载在classpath:META-INF/spring.factories
文件中属性key
为org.springframework.boot.SpringApplicationRunListener
的值——spring boot监听的全限定名
4.6 加载应用参数
根据程序入口main(String[] args)
中的参数配置对应的应用参数,等到应用参数对象。
4.7 根据应用参数及spring boot
监听配置环境并提供环境配置对象
获取或创建环境容器
加载配置文件并根据spring.profiles.active
加载profile
加载配置文件并触发环境前监听
4.8 打印横幅
4.9 创建ApplicationContext
4.10 创建失败分析器
加载在classpath:META-INF/spring.factories
文件中属性key
为org.springframework.boot.diagnostics.FailureAnalyzer
的值——失败分析器的全限定名,
并且注入BeanFactory
。
注意,此失败分析器与4.3提到的并不是一个失败分析器,当前创建失败分析器为配置spring.factories
中的失败分析器。
4.11 前置配置ApplicationContext
注入前面构建好的环境对象到ApplicationContext
根据BeanNamedGenerator
和ResourceLoader
后置处理ApplicationContext
应用所有初始化器
响应应用上下文前置监听
初始化日志对象
把应用参数对象加入到容器中
加载所有资源到ApplicationContext
响应应用加载时监听
4.12 刷新ApplicationContext
刷新BeanFactory
自定义后置处理Bean
工厂,若未继承SpringApplication
并且未实现该方法,未此步骤忽略
调用Bean
工厂后置处理器
注册Bean
后置处理器
初始化国际化
初始化应用事件
自定义刷新,若未继承SpringApplication
并且未实现该方法,未此步骤忽略
注册所有监听到容器
结束BeanFactory
初始化
结束IOC
容器初始化
注册销毁回调
4.13 刷新后处理
回调所有Runner